package xfuzzy.alg_genetico.indeterminado.evaluation;

import java.util.HashMap;
import java.util.List;

import xfuzzy.alg_genetico.indeterminado.database.DatabaseHandler;
import xfuzzy.alg_genetico.indeterminado.output.ConfigurationHandler;
import xfuzzy.xfghl.algorithm.ResultGA;
import xfuzzy.xfghl.codification.DoubleChromosome;
import xfuzzy.xfghl.codification.Encoder;
import xfuzzy.xfghl.model.XfghlConfig;
import xfuzzy.xfghl.population.Population;

public class EvaluationFile extends Evaluation {
	
	private String path;
	
	public EvaluationFile(int numVariables)  {
		
		if (numVariables == 7)
			this.path = "configuration_7_anchura_canonico_ite40_final.txt";
		if (numVariables == 6)
			this.path = "configuration_6_anchura_canonico_ite40.txt";
	}

	@Override
	public void evaluarPoblacion(Population poblacion, ResultGA result, XfghlConfig config) {
		
		HashMap<String, Double> fitness_map = ConfigurationHandler.getAllConfigurations(this.path);
		double fitness_value = 0.0;
		String codificacion = "";
		List<DoubleChromosome> poblacionList = poblacion.getIndividuos();
		for (DoubleChromosome cromosoma : poblacionList)  {
			 if (cromosoma.isEvaluated() == false)  {
				 if (cromosoma.getCanonic().isEmpty())  {
					 codificacion = Encoder.generarCanonico(cromosoma);
					 cromosoma.setCanonic(codificacion);
				 }
				 else  {
					 codificacion = cromosoma.getCanonic();
				 }
				 fitness_value = DatabaseHandler.getFitness(cromosoma);
				 if (fitness_value == Double.MAX_VALUE)  {
					 fitness_value = fitness_map.get(codificacion);
					 result.increaseNumEvaluations(1);
					 cromosoma.setFitness(fitness_value);
					 cromosoma.setEvaluated(true);
					 DatabaseHandler.saveConfigurations(cromosoma);
				 }
				 else  {
					 cromosoma.setFitness(fitness_value);
					 cromosoma.setEvaluated(true);
					 //result.increaseDatabaseCounter(1);
				 }
			 }
		}
	}
	
	public void evaluarIndividuos(DoubleChromosome nuevo1, DoubleChromosome nuevo2, ResultGA result, XfghlConfig config)  {
		
		HashMap<String, Double> fitness_map = ConfigurationHandler.getAllConfigurations(this.path);
		double fitness_value = 0.0;
		String codificacion = "";
		if (nuevo1.isEvaluated() == false)  {
			if (nuevo1.getCanonic().isEmpty())  {
				codificacion = Encoder.generarCanonico(nuevo1);
				nuevo1.setCanonic(codificacion);
			}
			else  {
				codificacion = nuevo1.getCanonic();
			}
			fitness_value = DatabaseHandler.getFitness(nuevo1);
			if (fitness_value == Double.MAX_VALUE)  {
				fitness_value = fitness_map.get(codificacion);
				result.increaseNumEvaluations(1);
				nuevo1.setFitness(fitness_value);
				nuevo1.setEvaluated(true);
				DatabaseHandler.saveConfigurations(nuevo1);
			}
			else  {
				 nuevo1.setFitness(fitness_value);
				 nuevo1.setEvaluated(true);
				 //result.increaseDatabaseCounter(1);
			 }
		}
		if (nuevo2.isEvaluated() == false)  {
			if (nuevo2.getCanonic().isEmpty())  {
				codificacion = Encoder.generarCanonico(nuevo2);
				nuevo2.setCanonic(codificacion);
			}
			else  {
				codificacion = nuevo2.getCanonic();
			}
			fitness_value = DatabaseHandler.getFitness(nuevo2);
			if (fitness_value == Double.MAX_VALUE)  {
				fitness_value = fitness_map.get(codificacion);
				result.increaseNumEvaluations(1);
				nuevo2.setFitness(fitness_value);
				nuevo2.setEvaluated(true);
				DatabaseHandler.saveConfigurations(nuevo2);
			}
			else  {
				 nuevo2.setFitness(fitness_value);
				 nuevo2.setEvaluated(true);
				 //result.increaseDatabaseCounter(1);
			 }
		}
	}
}
